package com.xiangge.demo;

import java.util.Arrays;
import java.util.Scanner;

/*
     二维数组      了解
        前提： 一维数组学号了, 再学习二维数组
        例如：
            1916[] 一包楼楼 = new 1916[20];           一维数组
            1916[][] 一条楼楼 = new 1916[10][20];     二维数组

        说明： 二维数组 = 一维数组 + 元素还是一个一维数组
        学习方法：
            1. 学会二维数组的声明和创建
            2. 学习二维数组元素的CRUD
            3. 学会二维数组元素的遍历
        二维数组的创建：    参考一维数组的创建
           -- 方式一： 使用new关键字创建二维数组并指定数组的长度
                 例如：
                  int[][] arr = new int[3][];
                 说明： 上面的创建，只能知道二维数组中有3个一维数组元素，但是每一个一维数组元素的长度和具体的元素未知
                 场景： 每一个一维数组的长度不一定相等时

           -- 方式二： 使用new关键字创建二维数组并指定二维数组的长度以及每一个一维数组的长度
                  例如： int[][] arr2 = new int[2][4];
                  说明：  上面的创建， 知道二维数组中有2个一维数组，而且每个一维数组的都有四个元素，但是元素都是默认值
                  场景： 每一个一维数组的长度相等时

            -- 方式三： 使用直接赋值的方式创建二维数组
                  例如： int[][] arr3 = new int[][] { {1,2} , {3,4,5} , {6,7,8,9} };
                  说明：  上面的创建，  知道二维数组中有3个一维数组, 而且每一个一维数组元素都赋值了。
                  场景： 每一个一维数组的长度已知,以及元素值已知

          二维数组的CRUD操作：
                说明：   arr[m][n] : 获取二维数组arr中索引为m的一维数组中 索引为n的元素值
                        二维数组的元素是一维数组, 一维数组是引用数据类型，所以二维数组中存入的元素是一维数组的内存地址
          二维数组的遍历：循环嵌套

          【随堂练习】
            1.有三个班级，第一个班级3个学生，第二个班级4个学生，第三个班级5个学生。要求通过键盘录入三个班级学生的成绩，并计算每个班级学生的的平均成绩。
 */
public class ArrayDemo2 {
    public static void main(String[] args) {
        // 1. 创建三个班级数组： clazz1 , clazz2 , clazz3 , 长度分别为： 3 , 4 , 5
        int[] clazz1 = new int[3];
        int[] clazz2 = new int[4];
        int[] clazz3 = new int[5];
        // 2. 分别给三个班级的学生录入成绩
        Scanner input = new Scanner(System.in);
        for (int i = 0; i < clazz1.length; i++) {
            System.out.println("请录入第一个班第：" + (i + 1) + "个学生成绩：");
            clazz1[i] = input.nextInt();
        }
        for (int i = 0; i < clazz2.length; i++) {
            System.out.println("请录入第二个班第：" + (i + 1) + "个学生成绩：");
            clazz2[i] = input.nextInt();
        }
        for (int i = 0; i < clazz3.length; i++) {
            System.out.println("请录入第三个班第：" + (i + 1) + "个学生成绩：");
            clazz3[i] = input.nextInt();
        }
        // 3. 创建一个二维数组：school 里面的元素是三个班级的一维数组
        int[][] school = {clazz1, clazz2, clazz3};
        // 4. 遍历二维数组school获取每一个班级的一维数组元素
        for (int i = 0; i < school.length; i++) {
            // 5. 获取每一个班级数组
            int[] arrayElement = school[i];

            // 6. 将每一个班级的分数累加求和
            double sum = 0.0;
            for (int score : arrayElement) {
                sum = sum + score;
            }
            // 输出结果
            System.out.println("第" + (i + 1) + "个班级的平均分为：" + sum / arrayElement.length);
        }
    }

    public static void main2(String[] args) {
        int[][] arr3 = new int[][] { {1,2} , {3,4,5} , {6,7,8,9} };
        for (int i = 0; i < arr3.length; i++) {
            // 获取每一个一维数组元素
            int[] eleArray = arr3[i];
            // 再遍历 eleArray
            for (int j = 0; j < eleArray.length; j++) {
                System.out.println(eleArray[j]);
            }
            System.out.println("---------------------------------------");
        }
    }
    public static void main1(String[] args) {
        // 方式一： 使用new关键字创建二维数组并指定数组的长度
        int[][] arr = new int[3][]; // --->   { {} , {} , {} }
        // 方式二： 使用new关键字创建二维数组并指定二维数组的长度以及每一个一维数组的长度
        int[][] arr2 = new int[2][4]; // ---> { {0,0,0,0} , {0,0,0,0} }
        // 方式三： 使用直接赋值的方式创建二维数组
        int[][] arr3 = new int[][] { {1,2} , {3,4,5} , {6,7,8,9} }; //  { 0x19 , 0x76 , 0x98 }
        // 二维数组的CRUD操作：
        // 1. 查询arr3的长度
        System.out.println(arr3.length); // 3
        // 2. 查询arr3中第三个一维数组的长度
        System.out.println(arr3[2].length);// 4
        // 3. 查询二维数组中第三个元素的 第一个元素值
        System.out.println(arr3[2][0]);// 6
        // 4. 将 二维数组中第一个元素中的最后一个元素改为：100
        arr3[0][1] = 100;
        System.out.println(Arrays.toString(arr3[0])); // [1, 100]
        // 5. 获取要删除元素的一维数组
        int[] delArr = arr3[1];
        int delIndex = 1;
    }
}
